#ifndef _BOARD_H_
#define _BOARD_H_

#include <string>
#include <map>
#include <vector>
#include <memory>
#include "./../inc/showfont.h"
using namespace std;

// 红先黑后
enum class PieceType
{
    kong,
    Rche1,
    Rma1,
    Rxiang1,
    Rshi1,
    Rshuai,
    Rshi2,
    Rxiang2,
    Rma2,
    Rche2,
    Rpao1,
    Rpao2,
    Rzu1,
    Rzu2,
    Rzu3,
    Rzu4,
    Rzu5,
    Bche1,
    Bma1,
    Bxiang1,
    Bshi1,
    Bjiang,
    Bshi2,
    Bxiang2,
    Bma2,
    Bche2,
    Bpao1,
    Bpao2,
    Bzu1,
    Bzu2,
    Bzu3,
    Bzu4,
    Bzu5,
};

class Lcd;
class Piece;

class Board
{
public:
    Board();
    // 初始化棋子
    void init_piece(Lcd *lcd);
    void show_piece();
    Piece *get_piece_at(int x, int y);
    bool is_in_palace(int to_x, int to_y);
    int move(int x, int y, int to_x, int to_y);
    // 显示提示信息
    void showExampleText(string text)
    {
        // 获取ShowFont实例
        ShowFont *showFont = ShowFont::instance();

        showFont->display(
            (char *)text.c_str(),
            32,
            200,
            40,
            ShowFont::yellow,
            ShowFont::black,
            320,
            80);
    }
    // 判断是否胜利
    int check_win_condition();
    // 重新开始
    void replay();

    // 获取指定位置的棋子类型
    PieceType get_board_piece(int row, int col) const;
    // 获取所有棋子的引用
    const vector<unique_ptr<Piece>> &get_pieces() const;
    // 获取当前回合角色 (0表示红方，1表示黑方)
    int get_current_role() const;
    // 设置当前回合角色
    void set_current_role(int role);
    // 获取LCD指针
    Lcd *get_lcd() const;
    // 获取指定位置的屏幕坐标 (x, y)
    pair<int, int> get_screen_position(int row, int col) const;
    // 检查指定位置是否有棋子
    bool has_piece(int row, int col) const;
    // 检查指定位置的棋子是否为红方
    bool is_red_piece(int row, int col) const;
    // 获取棋盘行数
    static int get_board_rows() { return 9; }
    // 获取棋盘列数
    static int get_board_cols() { return 10; }
    // 克隆当前棋盘状态（用于AI搜索）
    void clone_board_state(PieceType dest[9][10]) const;
    // 克隆棋子状态（用于AI搜索）
    void clone_pieces_state(vector<unique_ptr<Piece>> &dest) const;
    // 应用棋盘状态（用于AI搜索）
    void apply_board_state(PieceType src[9][10]);
    // 应用棋子状态（用于AI搜索）
    void apply_pieces_state(vector<unique_ptr<Piece>> &src);
    // 执行移动（用于AI）
    bool execute_move(int from_row, int from_col, int to_row, int to_col);
    // 撤销移动（用于AI）
    void undo_move(int from_row, int from_col, int to_row, int to_col, PieceType captured_piece);
    // 克隆单个棋子（用于AI搜索）
    unique_ptr<Piece> clone_piece(const Piece *piece) const;

private:
    PieceType board[9][10];
    Lcd *lcd;
    vector<unique_ptr<Piece>> pieces; // 存储棋子位置
    int role;
};

#endif